// src/services/api.js
import axios from 'axios'

// 创建 axios 实例
const apiClient = axios.create({
  // 使用环境变量，方便不同环境切换 (开发/测试/生产)
  // baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080/api', // <-- 旧配置
  baseURL: 'http://localhost:8080/api', // <-- 新配置
  timeout: 10000, // 请求超时时间 (毫秒)
})

// 请求拦截器 - 在发送请求之前做些什么，比如添加 JWT Token
apiClient.interceptors.request.use(
  (config) => {
    // 1. 从本地存储 (localStorage 或 sessionStorage) 获取 Token
    const token = localStorage.getItem('accessToken')
    // 2. 如果 Token 存在，则将其添加到请求头的 Authorization 字段中
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  },
)

// 响应拦截器 - 在接收到响应后做些什么，比如处理通用错误或 Token 过期
apiClient.interceptors.response.use(
  (response) => {
    // 2xx 范围内的状态码都会触发该函数
    // 可以在这里对响应数据进行统一处理 (如果需要)
    return response
  },
  (error) => {
    // 超出 2xx 范围的状态码都会触发该函数
    if (error.response) {
      // 服务器返回了错误状态码
      switch (error.response.status) {
        case 401:
          // 401: 未授权，可能是 Token 过期或无效
          console.warn('Unauthorized access - Redirecting to login.')
          // 清除本地存储的 Token 和用户信息
          localStorage.removeItem('accessToken')
          localStorage.removeItem('user')
          // TODO: 重定向到登录页 (需要结合 Router 和 Store)
          // router.push('/login');
          // 或者触发 Pinia Store 中的登出动作
          break
        case 403:
          console.error('Forbidden: Access denied.')
          // 可以提示用户权限不足
          break
        case 404:
          console.error('Not Found:', error.response.config.url)
          // 可以提示资源未找到
          break
        case 500:
          console.error('Internal Server Error')
          // 可以提示服务器内部错误
          break
        default:
          console.error(
            `Error ${error.response.status}:`,
            error.response.data?.message || error.message,
          )
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      console.error('Network Error:', error.request)
      // 可以提示网络错误
    } else {
      // 其他错误
      console.error('Error:', error.message)
    }
    return Promise.reject(error)
  },
)

export default apiClient
